package MAIN;
//笔试强训第16天
//选择题
/*数据库中两个事务同时操作同一张表，不会引起冲突的是：都是delete，此时一个操作就是一个会话，
* 会话之间是不能同时执行的，两个同时执行会产生冲突 。注：只是说一个操作，但是并不只是执行一次，
* 同一个会话执行两次，前后产生的数据不一样都称作产生冲突，如果两个操作都是update，但是更新时
* 是按照分数为条件的，此时第一个会话将分数改了，第二个会话再根据分数进行update的时候，就找不到这个
* 原来的分数了，所以都是update就会产生冲突，如果都是删除某一个数据，第二次删除的时候也不会报错，
* 显示执行成功，但是没有删除任何数据*/
/*MySQL使用的通讯协议：TCP/IP，共享内存（Share Memory协议，这个协议只有Windows可以使用）;Socket*/
/*MySQL服务器是一个数据库服务器，所以必须保证数据传输的可靠性，所以不能使用UDP协议的*/
/*两个是事务并发操作时，t1读a=100，A=A+10写回，t2读A=100，A=A-10写回，此时的结果不是原来的100了
* 每个事务进行写回的操作都是基于上一次读的数据，所以t1事务写回的是110，t2事务写回的是90，该操作称为
* 丢失修改*/
/*不可重复读：一个事务进行修改，另一个事务在第一个事务修改前后读的数据是不同的*/
/*脏读数据：一个事务修改a=110，另一个事务读a=110，之后第一个事务进行rollback(回滚操作)，
* 此时修改的数据是无效的，所以另一个事务读的数据就称为脏数据*/
/*排他锁：一个事务获得了某个数据的排他锁之后，只有这个事务可以对这个数据进行任何操作都可以，其他的事务
* 则不能进行任何对这个数据的操作*/
/*候选键属于超键，是最小的超键，如果去掉候选键中的任何一个字段，这个候选键都不能称为超键了*/
/*修改表结构的关键字都是alter table 表名，添加（add） 删除（drop） 修改表字段名称（change）
* 修改表字段类型（modify）*/

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//编程题
public class Main16 {
    //扑克牌大小
    //思路：按照比较规则进行输出即可，多张牌的情况下，只需要比较第一张牌即可
    public static void main1(String[] args) {
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();
        //将两手牌放进一个数组中，然后进行分割
        String[] strs = str.split("-");
        String[] p1 = strs[0].split(" ");//第一手牌
        String[] p2 = strs[1].split(" ");//第二手牌
        String p = "34567891JQKA2";
         //首先如果有大小王，先比较大小王
        if (strs[0].equals("joker JOKER") || strs[1].equals("joker JOKER")) {
            System.out.println("joker JOKER");
        }else if (p1.length == p2.length) {
            //要进行第一手牌和第二手牌的字符串的截取（有可能第一张牌是10，但是上边的p是用1表示的）
            if (p.indexOf(p1[0].substring(0,1)) > p.indexOf(p2[0].substring(0,1))) {
                System.out.println(strs[0]);
            }else {
                System.out.println(strs[1]);
            }
            //长度不想等的情况，王炸已经考虑了，就只剩下炸弹了
        }else if (p1.length == 4) {//第一手牌是炸弹，就输出
            System.out.println(strs[0]);
        }else if (p2.length == 4) {//第二手牌是炸弹,也输出
            System.out.println(strs[1]);
        }else {//长度不想等，但是也不是炸弹，就没有比较规则，
            System.out.println("ERROR");
        }
    }

    //完全数计算
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNextInt()) {
            int n = scan.nextInt();
            int count = 0;
            //i就是计算n之前的数字是否是完美因数
            for (int i = 2; i <= n; i++) {
                int sum = 0;
                //j代表的是i的因数
                for (int j = 2; j*j <= i; j++) {
                    if (i % j == 0) {
                        if (i / j == j) {
                            sum += j;//16/4=4，这个因数只能加一次
                        }else {
                            //j是其中的一个因数，i/j是另外一个因数
                            sum += j + i/j;
                        }
                    }
                }
                //最后要加上1这个因数
                if (sum+1 == i) {
                    count++;
                }
            }
            System.out.println(count);
        }
    }
}
